vagrant是拿來建vm的,建完後直接可以ssh (超方便)
就算你不想用vagrant,您還是得懂它,因為很多k8s、ansible專案都有用vagrant,
加減了解,才知道哪些設定檔是vagrant、哪些是ansible,
而且vagrant跟ansible很多副檔名都叫yml,熟一點比較不會搞錯
通常會再配合ansible對vm跑一些自動化的腳本(後面再介紹)
備註:這篇只是簡單介紹 vagrant ,並做簡單的牛刀小試
https://app.vagrantup.com/bento/boxes/ubuntu-18.04
http://www.cc.ntu.edu.tw/chinese/epaper/0040/20170320_4006.html
相信大部分的人都有用VS Code,可裝下面2個Extensions,下載數都很高
一、Vagrant
可以在VS Code下一些Vagrant指令
vagrant up Vagrant: Up
vagrant provisionVagrant: Provision
vagrant suspendVagrant: Suspend
vagrant haltVagrant: Halt
vagrant destroy -fVagrant: Destroy
vagrant reloadVagrant: Reload
vagrant statusVagrant: Status
二、Vagrantfile Support
這個必裝,highlight vagrantfile,比較好看
三、YAML Support by Red Hat
裝了比較好看 YAML 檔,大概有5項功能
YAML validation
Document Outlining (Ctrl + Shift + O)
Auto completion (Ctrl+Space)
Hover support
Formatter
https://www.virtualbox.org/wiki/Linux_Downloads
下載最新的點2下就能安裝了
virtualbox-5.2_5.2.18-124319~Ubuntu~bionic_amd64.deb
https://www.vagrantup.com/downloads.html
macOS
下載dmg檔,拉到application就好了
vagrant_2.1.5_x86_64.dmg
Ubuntu
下載Debian 64-bit,點2下deb檔就能安裝了
先建個工作目錄
$ mkdir ~/myDevEnv
$ cd ~/myDevEnv
用 vagrant 初使化一個 ubuntu-18.04 的虛擬機
參考:https://app.vagrantup.com/bento/boxes/ubuntu-18.04
$ vagrant init bento/ubuntu-18.04 #使用官方打包後的作業系統,會初使化一個Vagrant file
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
# -*- mode: ruby -*-
# vi: set ft=ruby :
# 1代表1.0.x的設定,2代表1.1+ ~ 2.0.x 的設定
# 所以你如果看到 Vagrant.configure("1"),代表那個專案可能超老舊的囉
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-18.04"
end
在~/myDevEnv/會多出 資料夾 .vagrant
$ ll ./.vagrant/machines/default/virtualbox/
40B action_provision
10B action_set_name
3B creator_uid
36B id
32B index_uuid
1.6K private_key # RSA的private key,我猜是ssh的private key吧
122B synced_folders #json格式的設定檔
{
"virtualbox":
{
"/vagrant":
{
"guestpath":"/vagrant",
"hostpath":"/Users/xx/myDevEnv",
"disabled":false,
"__vagrantfile":true
}
}
}
~/VirtualBox VMs/myDevEnv_default_1536610941331_60767/ubuntu-18.04-amd64-disk001.vmdk 2GB
action_set_name 153661
$ vagrant up
$ vagrant ssh # 直接連到 default 的 vm
vagrant@vagrant:~$
$ vagrant ssh-config
# 虛擬主機 masterNode01 的 private key 的存放位置
IdentityFile /Users/xx/myDevEnv/.vagrant/machines/masterNode01/virtualbox/private_key
在更多的情境下,我們可能不會用到vagrant
如果我們不是用vagrant來建vm,就必須懂 「ssh設定」 & 「ssh for ansible設定」
其他常用指令
$ vagrant version # 版本,我用的版本是
$ vagrant box list # 列出所有 vagrant boxes (類似 docker images)
$ vagrant box remove bento/ubuntu-18.04 # 刪除 box
$ vagrant status # 目前運行狀況
$ vagrant up # 啟動 虛擬機
$ vagrant provision # 啟動 已存在的 虛擬機
$ vagrant halt # 暫停 虛擬機
$ vagrant destroy # 砍掉 虛擬機
我們的目的是用 vagrant 建一堆 ubuntu vm ,這些 ubuntu vm 再用 kubeadm 建 k8s cluster
所以我們先建 Master Node,後續再用ansible自動化設定
config.vm.define "masterNode01" # 很重要,跟ansible的inventory(主機清單)名稱要一樣
也是YAML格式,電腦清單,除了可設連線的帳號、ssh port,還可以給一堆環境變數
$ vim ~/myDevEnv/inventory
[masterNode01]
127.0.0.1 ansible_port=2222 ansible_user=vagrant # 預設建完 2222
[masterNode]
# 這樣就是masterNode01~masterNode10
masterNode[01:10].local ansible_port=22 ansible_user=vagrant
ansible_host
ansible_port # 如果ssh不是走22,就要給
ansible_user # ssh user account
其他參數
ansible_ssh_pass # 敏感變數or資訊,參考 variables and vaults https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#best-practices-for-variables-and-vaults
透過 ansible.cfg 這個檔案的設定來告訴 Ansible SSH 金鑰以及 inventory file 的位置
目前我們的~/myDevEnv目錄底下的檔案
ansible.cfg
hosts
inventory
Vagrantfile
VirtualBox多了一個vm
myDevEnv_masterNode01_1536618176680_13231
###再來看某個專案的 Vagrantfile
最後,再來補充說明一下vagrantfile,採用ruby語言
參考官網的說明文件:
https://www.vagrantup.com/docs/vagrantfile/machine_settings.html
ENV["LC_ALL"] = "en_US.UTF-8" # host的local環境變數 在進行 ssh連線時傳給 guest
config.ssh.insert_key = false # 取消 insecure keypair(一組key pair連所有vm)
config.ssh.insert_key = true # Vagrant將自動插入keypair,此private key是沒保護的,所以很危險?
config.vm.provision "shell", inline: "echo Hello"
config.ssh.username = "vagrant" # 預設是vagrant
#config.ssh.password = "" # ssh的密碼,如果您使用password,如果insert_key=ture,Vagrant將自動插入keypair
config.ssh.host # hostname or ip,預設是empty
config.ssh.port # 預設是 22,如果你的ssh不是用22,就要給
config.ssh.guest_port
config.ssh.private_key_path # 預設是指向vagrant建立的 insecure private key
config.ssh.keys_only = ture # 只用vagrant產生的private keys,不使用其他ssh-agent
config.ssh.keep_alive = ture # 每5秒發1個keep-alive,避免ssh斷線
# 定義多台vm,應該可以寫到inventory
config.vm.define "masterNode-1" do |masterNode01|
masterNode01.vm.box = "bento/ubuntu-18.04"
masterNode01.vm.network "private_network", ip: "192.168.50.4",
virtualbox__intnet: true # only for the VirtualBox provider
masterNode01.vm.provision "shell",inline:"echo hello from masterNode01"
end
config.vm.define "masterNode-2", autostart: false # 在 vagrant up 時,不要建此 vm
masterNode02.vm.box = "bento/ubuntu-18.04"
masterNode02.vm.network "private_network", ip: "192.168.50.4",
virtualbox__intnet: "mynetwork" # 加到一個 internal network
end
#用迴圈跑
N = 2
(1..N).each do |i|
config.vm.define "masterNode-#{i}" do |node|
node.vm.provision "shell",
inline: "echo hello from node #{i}"
end
end
# host 的 8080 forwarded port mapping 到 VM 的 80
# config.vm.network "forwarded_port", guest: 80, host: 8080
# 只能用 host 的 127.0.0.1 連
# config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
# 設定 vm 的 private ip
# config.vm.network "private_network", ip: "192.168.33.10"
# Bridged 到實體網卡
# config.vm.network "public_network"
# 參考:https://www.vagrantup.com/docs/provisioning/ansible_intro.html
# Run Ansible from the Vagrant Host
# 用Vagrant建立vm,設定交給ansible,playbook.yml是ansible的腳本
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
end
# 跑2台vm的ansible-playbook playbook.yml
N = 2
(1..N).each do |machine_id|
config.vm.define "machine#{machine_id}" do |machine|
machine.vm.hostname = "masterNode0#{machine_id}"
machine.vm.network "private_network", ip: "192.168.77.#{20+machine_id}"
# Only execute once the Ansible provisioner,
# when all the machines are up and ready.
if machine_id == N
machine.vm.provision :ansible do |ansible|
# Disable default limit to connect to all the machines
ansible.limit = "all"
ansible.playbook = "playbook.yml"
end
end
end
end
===
###結語
當我們下完建vm的指令,
vagrant什麼都沒問就是建virtualbox的vm,
而且連名字都取好了(像我的是叫 myDevEnv_default_1536610941331_60767)
$ vagrant init bento/ubuntu-18.04
1.在macos,如果我想建VMWare Fusion的VM呢?
2.在ubuntu,如果我想建VMWare Workstation的VM呢?
這個要花79USD買plugin才能試
Vagrant除了在今天workplace工作目錄(~/myDevEnv) 跟 ~/VirtualBox VMs 產生檔案
似乎還會產生一些VirtualBox的檔案(例如:Virtual NIC)
所以保險一點是在VM裡面玩vagrant